#include <iostream>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

void handler(int sig)
{
    pid_t id;
    while ((id = waitpid(-1, NULL, WNOHANG)) > 0)
    {
        printf("wait child success: %d\n", id);
    }
}

int main()
{
    signal(SIGCHLD, handler);
    pid_t cid;
    for (int i = 0; i < 10; i++)
    {
        if ((cid = fork()) == 0)
        {
            // child
            printf("child : %d\n", getpid());
            sleep(3);
            exit(1);
        }
    }
    while (1)
    {
        printf("father proc is doing some thing!\n");
        sleep(1);
    }
    return 0;
}

// volatile int flag = 0;
// void sighandler(int sig)
// {
//     printf("chage flag 0 to 1\n");
//     flag = 1;
// }

// int main()
// {
//     signal(SIGINT, sighandler);
//     while (!flag)
//         ;
//     printf("process quit normal\n");
//     return 0;
// }

// void sighandler(int sig)
// {
//     std::cout << "获得信号[" << sig << "]" << std::endl;
//     while(true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         for(int i = 31; i >= 1; i--)
//         {
//             if(sigismember(&pending, i))
//                 std::cout << 1;
//             else
//                 std::cout << 0;
//         }
//         std::cout << std::endl;
//         sleep(2);
//     }
//     exit(0);
// }

// int main()
// {
//     struct sigaction act, old_act;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     act.sa_handler = sighandler;

//     sigaction(SIGINT, &act, &old_act);
//     while(true)
//     {
//         std::cout << "hello world: " << getpid() << std::endl;
//         sleep(2);
//     }
//     return 0;
// }